; bool smooth()

; constantes globales
	%include "constantes.mac"

; variables locales

	%define black			 	[ebp - 4]
	%define white			 	[ebp - 8]

	%define bytes_reservados 8

extern sumatoriaCruz
extern printf

global smooth

section .data

xxx db "%i - %i |  "

section .text

smooth:

	push ebp		; creo el marco de la pila
	mov ebp, esp	; creo el marco de la pila

	sub esp, bytes_reservados	; reservo memoria en la pila

	push ebx		; salvo registros convencion C
	push edi		; salvo registros convencion C
	push esi		; salvo registros convencion C

inicializar_variables:

	mov dword white, 0			; white = 0
	mov dword black, 0			; black = 0

	xor esi, esi				; esi = contador de fila = 0

para_cada_fila:

	cmp esi, alto_pantalla		; esi = alto_pantalla ? termino
	jge fin						; esi = alto_pantalla ? termino

	xor edi, edi				; edi = contador de columna = 0

para_cada_columna:

	cmp edi, ancho_pantalla		; edi = ancho_pantalla ? cambio de fila
	jge siguiente_fila			; edi = ancho_pantalla ? cambio de fila

	jmp apilo_parametros_suma_cruz

printeo:

	mov ebx, edi				; parametro 2 -> columna
	push ebx
	mov ebx, esi				; parametro 1 -> fila
	push ebx
	mov ebx, dword xxx
	push ebx
	call printf
	add esp, 12

apilo_parametros_suma_cruz:

	mov ebx, edi				; parametro 2 -> columna
	push ebx
	mov ebx, esi				; parametro 1 -> fila
	push ebx

sumo_cruz:

	call sumatoriaCruz
	add esp, 8

	cmp eax, 0					; if (sumatoria == 0)
	je sumo_negro

sumo_blanco:
	inc dword white				; contadorBlancos++
	jmp siguiente_columna

sumo_negro:
	inc dword black				; contadorNegros++
	jmp siguiente_columna

siguiente_columna:

	inc edi
	jmp para_cada_columna

siguiente_fila:

	inc esi
	jmp para_cada_fila

fin:

	xor eax, eax				; eax = false

	mov ecx, dword white		; ecx = white
	mov edx, dword black		; edx = black

	cmp edx, ecx				; contadorNegros > contadorBlancos
	jg mayoria_negros

mayoria_blancos:
	jmp desarmo_pila

mayoria_negros:
	inc eax						; eax = true

desarmo_pila:

	pop esi						; desarmo el stack frame
	pop edi						; desarmo el stack frame
	pop ebx						; desarmo el stack frame
	add esp, bytes_reservados	; desarmo el stack frame
	pop ebp						; desarmo el stack frame

	ret
